package shuati.chuanzhibei.chuanzhi24;

import java.util.HashMap;
import java.util.Scanner;

/**
 * @author : LdLtd
 * @Date : 2024/12/21
 * @Description:
 * 游游拿到了一个仅包含小写字母的字符串。游游想截取一段连续子串，需要保证该子串不同的字母种类不超过k个。游游想知道，这个子串长度的最大值是多少?
 * 输入描述
 * 第一行输入两个正整数n 和k，分别代表字符串长度、需要保证的字母种类最大数量
 * 第二行输入一个长度为 n的，只包含小写字母的字符串。
 * 1<=n<=200000
 * 1<=k<=26
 * 输出描述
 * 子串长度的最大值。
 * |示例 1
 * 输入
 * 53
 * aabcd
 * 输出
 * 4
 * 说明
 * 取子串"aabc"即可，有三种不同字符。
 */
public class P5 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 输入 n 和 k
        int n = sc.nextInt();
        int k = sc.nextInt();
        sc.nextLine(); // 消耗换行符

        // 输入字符串
        String s = sc.nextLine();

        // 调用方法并输出结果
        System.out.println(maxSubstringLength(s, k));
    }

    public static int maxSubstringLength(String s, int k) {
        HashMap<Character, Integer> charCount = new HashMap<>();
        int left = 0;
        int maxLength = 0;

        for (int right = 0; right < s.length(); right++) {
            // 增加右指针所指字符的计数
            charCount.put(s.charAt(right), charCount.getOrDefault(s.charAt(right), 0) + 1);

            // 如果不同字母的种类超过了 k，移动左指针
            while (charCount.size() > k) {
                charCount.put(s.charAt(left), charCount.get(s.charAt(left)) - 1);
                if (charCount.get(s.charAt(left)) == 0) {
                    charCount.remove(s.charAt(left));
                }
                left++;
            }

            // 更新最大子串长度
            maxLength = Math.max(maxLength, right - left + 1);
        }

        return maxLength;
    }
}
